package com.arpa.wms.mapper;

import com.arpa.wms.domain.dto.DeliveryItemDTO;
import com.arpa.wms.domain.dto.PickingItemDTO;
import com.arpa.wms.domain.dto.RecheckOperationDto;
import com.arpa.wms.domain.entity.DeliveryItem;
import com.arpa.wms.domain.vo.DeliveryItemVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 出货单明细 Mapper 接口
 * </p>
 *
 * @author LEO
 * @since 2020-08-07
 */
public interface DeliveryItemMapper extends BaseMapper<DeliveryItem> {

    /**
     * 查询列表
     * @param deliveryItemDTO
     * @return
     */
    List<DeliveryItemVO> queryList(DeliveryItemDTO deliveryItemDTO);

    /**
     * 查询合计,包含总数
     * @param deliveryItemDTO
     * @return
     */
    DeliveryItemVO queryListSum(DeliveryItemDTO deliveryItemDTO);

    /**
     *  @author: Allen chen
     *  @Date: 2020/8/14 16:39
     *  @Description: 批量删除
     */
    int batchDel(List<DeliveryItemVO> list);

     /**
      *  @author: Allen chen
      *  @Date: 2020/9/15 19:58
      *  @Description: 根据code批量更新状态
      */
    int batchUpdateStatusByCode(@Param("list") List<String> list,@Param("status")Integer status,@Param("modifiedBy") String modifiedBy);


     /**
      *  @author: Allen chen
      *  @Date: 2020/8/20 13:39
      *  @Description: 根据出货单code查询出货单明细
      */
    List<DeliveryItemVO> queryListByItemCode(DeliveryItem item);


    /**
     * 拣货确认时，根据拣货单明细信息更新订单明细拣货数量
     * @param pickingItemDTO
     * @return
     */
    int updatePickingQuantity(PickingItemDTO pickingItemDTO);

    /**
     * 从订单明细中查询可退货商品明细信息
     * @param deliveryCode
     * @return
     */
    List<DeliveryItemVO> queryCanRefundItems(@Param("deliveryCode")String deliveryCode, @Param("groupCode") String groupCode);

    /**
     * 提交退货单时，更新订单明细的退货数量
     * @param deliveryItemDTO
     * @return
     */
    int updateRefundQuantity(DeliveryItemDTO deliveryItemDTO);

    int updateStatusByDeliveryCode(@Param("deliveryCode") String deliveryCode, @Param("status") String status,@Param("groupCode")String groupCode);

    int adjustDistributionQuantity(DeliveryItemDTO deliveryItemDTO);

    /***
     * @description
     * 拣货单确认时，根据订单号，更新订单明细中的拣货数量
     * @author xuyang
     * @date 2020/10/23 14:12
     * @param deliveryCode:
     **/
    int updatePickingQuantityForCheck(@Param("deliveryCode")  String deliveryCode, @Param("groupCode")  String groupCode);

    /**
     * 收货完成时修整发货单的退货数量
     * @param deliveryCode
     * @return
     */
    int updateRefundQuantityByReceiveItem(@Param("deliveryCode") String deliveryCode, @Param("groupCode") String groupCode);

    /**
     * @description
     * 查询退货单明细， 关联收货单获取可退数量
     * @author xuyang
     * @date 2020/12/16 8:19
     * @param deliveryItemDTO:
     **/
    List<DeliveryItemVO> queryRefundList(DeliveryItemDTO deliveryItemDTO);

    /**
     * 出库复核时调整分配数量，如缺货登记后
     * @param deliveryItemCodes
     * @return
     */
    int updateDistributionQuantityForOutboundRecheck(@Param("deliveryItemCodes") Set<String> deliveryItemCodes);

    /**
     * 根据波次号更新发货单明细的出库数量
     * @param wavePickingCode
     * @return
     */
    int updateOutboundQuantityByWavePickingCode(@Param("wavePickingCode") String wavePickingCode);

    /**
     * 根据波次号更新发货单明细的拣货数量
     * @param wavePickingCode
     * @return
     */
    int updatePickingQuantityStatusByWavePickingCode(@Param("wavePickingCode") String wavePickingCode, @Param("status") String status, @Param("groupCode") String groupCode);

    /**
     * 普通复核更新复核数量
     * @author liuxr
     * @date 2021/4/12 18:45
     * @param code 订单明细code
     * @param reviewCount 复核数量
     * @return int 更新条数
     */
    int generalReviewUpdateInfo(@Param("code") String code, @Param("reviewCount") BigDecimal reviewCount);

    /**
     * 根据订单Code以分组的方式查询订单详情信息
     * @param deliveryCodes
     * @return
     */
    List<Map<String,Object>> getDeliveryItemList(@Param("deliveryCodes") List<String> deliveryCodes);

    /**
     * @param itemCode :
     * @param status   :
     * @description 根据拣货量与复核量+退减量的比较，尝试更新明细的状态
     * @author xuyang
     * @date 2020/10/29 8:55
     **/
    int updateStatusIfFinishRecheck(@Param("code") String itemCode, @Param("status") String status);

    /**
     * 根据订单号更新发货明细的复核数量
     * @param deliveryCode
     * @return
     */
    int updateRecheckQuantity(@Param("deliveryCode") String deliveryCode,@Param("groupCode") String groupCode,@Param("updateNotRecheckQuantity") boolean updateNotRecheckQuantity);

    /**
     * @description
     * 根据波次号，更新复合数量和状态
     * @author rfwang
     * @date 2021年7月16日
     * @param wavePickingCode:
     **/
    int updateRecheckQuantityAndStatsuByWavePickingCode(@Param("wavePickingCode") String wavePickingCode,@Param("groupCode")String groupCode);

    String getShipmentCodeByDeliveryCode(@Param("deliveryCode") String deliveryCode,@Param("groupCode")String groupCode);

    /**
     * 批量更新复核数量
     * @author rfwang
     * @date 2021/12/20 20:12
     * @param recheckOperationDtoList
     * @return
     */
    void batchRecheck(List<RecheckOperationDto> recheckOperationDtoList);

    /**
     * 插叙汇总的分配数量
     * @param deliveryItemDTO
     * @return
     */
    List<DeliveryItemVO> querySumDistributionQuantity(DeliveryItemDTO deliveryItemDTO);
}
